package modelo.enemigos;

// paquetes de proyecto
import java.io.Serializable;
import java.util.Observable;

import modelo.interfaces.Posicionable;
import modelo.juego.Configuracion;
import modelo.mapa.Casillero;
import modelo.mapa.Mapa;

public abstract class Enemigo extends Observable implements Posicionable, Serializable {

	protected Casillero casilleroActual;
	protected double Velocidad;
	protected int Resistencia;
	protected boolean Congelado = false;
	protected boolean Vuela = false;
	protected double Avance = 0;
	protected boolean llego = false;

	public boolean llego() {
		return llego;
	}

	public void setLlego(boolean llego) {
		this.llego = llego;
	}

	public Casillero getCasillero() {
		return casilleroActual;
	}

	public void setCasillero(Casillero nuevoCasillero) {
		casilleroActual = nuevoCasillero;
		/*setChanged();
		notifyObservers();*/
	}

	public void Daniar(int danio) {
		Resistencia -= danio;
	}

	public int getResistencia() {
		return Resistencia;
	}

	public void CambiarVelocidad(double multiplicador) throws RuntimeException {
		if (multiplicador == 0)
			throw new RuntimeException("Se multiplico una velocidad por cero");
		Velocidad *= multiplicador;
	}

	public void Congelar(boolean estado) {
		Congelado = estado;
	}

	public boolean getCongelado() {
		return Congelado;
	}

	public void avanzar(Mapa mapa) throws ExceptionPasoUltimoCasillero {
		if (this.Congelado == false) {
			if (mapa.esUltimaPosicion(this.casilleroActual))
				throw new ExceptionPasoUltimoCasillero();

			else {
				Avance += Velocidad;
				while (Avance >= Configuracion.VELOCIDAD_DE_TURNO) {
					Avance -= Configuracion.VELOCIDAD_DE_TURNO;
					Casillero casilla = casilleroActual;
					mapa.actulizarPosicion(mapa.proximaPosicionDeCamino(casilleroActual), this);
					setChanged();
					notifyObservers(casilla);
					
				}
			}
		}
	}

	public boolean getVolar() {
		return Vuela;
	}

	public double getVelocidad() {
		return Velocidad;
	}

	public abstract int dineroPorEliminacion();
	
	public abstract void RecrearVista();
}
